package com.oncallmng.service;

import com.oncallmng.common.PageParam;
import com.oncallmng.common.PageResult;
import com.oncallmng.model.Schedule;
import com.oncallmng.model.User;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 排班服务接口
 */
public interface ScheduleService {
    
    /**
     * 根据ID查询排班
     * @param id 排班ID
     * @return 排班信息
     */
    Schedule getById(String id);
    
    /**
     * 分页查询排班列表
     * @param pageParam 分页参数
     * @param teamId 团队ID
     * @return 排班列表
     */
    PageResult<Schedule> page(PageParam pageParam, String teamId);
    
    /**
     * 创建排班
     * @param schedule 排班信息
     * @return 排班ID
     */
    String create(Schedule schedule);
    
    /**
     * 更新排班
     * @param schedule 排班信息
     */
    void update(Schedule schedule);
    
    /**
     * 删除排班
     * @param id 排班ID
     */
    void delete(String id);
    
    /**
     * 添加排班成员
     * @param scheduleId 排班ID
     * @param userId 用户ID
     */
    void addMember(String scheduleId, String userId);
    
    /**
     * 移除排班成员
     * @param scheduleId 排班ID
     * @param userId 用户ID
     */
    void removeMember(String scheduleId, String userId);
    
    /**
     * 调整排班成员顺序
     * @param scheduleId 排班ID
     * @param userIds 用户ID列表
     */
    void adjustMemberOrder(String scheduleId, List<String> userIds);
    
    /**
     * 获取指定时间的值班人员
     * @param teamId 团队ID
     * @param time 时间点
     * @return 值班人员
     */
    User getOnCallUser(String teamId, LocalDateTime time);
    
    /**
     * 获取指定日期范围的值班表
     * @param teamId 团队ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 日期-值班人员映射
     */
    List<Schedule> getOnCallCalendar(String teamId, LocalDate startDate, LocalDate endDate);
    
    /**
     * 导出排班日历（ICS格式）
     * @param scheduleId 排班ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return ICS文件内容
     */
    String exportCalendar(String scheduleId, LocalDate startDate, LocalDate endDate);
} 